import {
  destroyObject
} from '@cesiumjs';
import {
  g3x_defineProperty,
  g3x_defineReadonly,
  g3x_defineClassProperties,
  objectClone,
  objectCombine
} from "@g3x/utils";
import {
  autorun,
  reaction,
  intercept,
  extendObservable,
  computed
} from 'mobx';
// import initSchema from "./schema";
import g3xExtends from "./extends";

/* 7 */

function defaultOptionsOf(target) {
  const proto = Object.getPrototypeOf(target)
  return proto.constructor && proto.constructor.defaultOptions
}

function injectProps(target, options) {
  const defaultOptions = defaultOptionsOf(target)
  options = {
    ...defaultOptions,
    ...options
  }
  g3x_defineReadonly(target, "options", options);
  extendObservable(target, options)

  // Object.keys(options).forEach(k => {
  //   Object.defineProperty(target, k, {
  //     get() {
  //       return options[k];
  //     },
  //     set(value) {
  //       options[k] = value;
  //     }
  //   })
  // })
}

// XbsjBase可以用来转化成JSON格式
/*
XbsjBase转JSON的一些逻辑问题：
1 toJSON()/toJSONStr() 对于以XbsjBase作为基类的对象，只输出defaultOptions中有的属性，对于其他对象，输出所有属性，除非_toJsonFilterKeys中存在该属性。
2 toAllJSON()/toAllJSONStr()  只有_toJsonFilterKeys中的属性不输出，其他所有属性都输出
3 xbsjFromJSON() 只要是_fromJsonFilterKeys没有的属性，一律赋值
 */

/**
 * 所有需要读写的对象的基类
 * @description 从该基类派生的对象，具备读写能力。
 * @class
 */
class G3xObjBase {
  constructor(options) {
    console.log("G3xObjBase constructor!")

    const _this = this;
    // const defaultOptions = objectClone(_this._defaultOptions,true);
    // options = {...defaultOptions,...options};
    
    options = objectCombine(options, _this._defaultOptions, true);
    extendObservable(_this, options);

    // 让所有defaultOptions变量都不可删除！
    Object.keys(options).forEach(function(propertyName) {
      Object.defineProperty(_this, propertyName, {configurable: false})
    });

    this.ignoreDefualt = true;
    this._fromJsonFilterKeys = ['ignoreDefualt'];
    this._toJsonFilterKeys = ['ignoreDefualt'];

    extendObservable(_this, {
      _isDestroying: false,
      get isDestroying() {
        return _this._isDestroying;
      }
    }, {
      isDestroying: computed
    });

    this._disposers = [];
  }
}

g3xExtends(G3xObjBase)

export default G3xObjBase;
export {
  G3xObjBase
};
